broadway: Simplify frame handling and make it ARGB32
authorAlexander Larsson <alexl@redhat.com>
Wed, 6 Nov 2013 11:54:37 +0000 (12:54 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 7 Nov 2013 13:09:53 +0000 (14:09 +0100)
This completely removes the delta compression and makes all buffers ARGB.
This is obviously slower, but this will be re-integrated later.

gdk/broadway/broadway-server.c
gdk/broadway/broadway.js
gdk/broadway/gdkbroadway-server.c
gdk/broadway/gdkscreen-broadway.c

index d51551d67f1e23a58e0d6080c11b34233a4b3517..d771e167da5e71e930cbbb84c66d42e1af9e4c8d 100644 (file)
@@ -1380,44 +1380,6 @@ broadway_server_has_client (BroadwayServer *server)
   return server->output != NULL;
 }
 
-static void
-diff_surfaces (cairo_surface_t *surface,
-              cairo_surface_t *old_surface)
-{
-  guint8 *data, *old_data;
-  guint32 *line, *old_line;
-  int w, h, stride, old_stride;
-  int x, y;
-
-  data = cairo_image_surface_get_data (surface);
-  old_data = cairo_image_surface_get_data (old_surface);
-
-  w = cairo_image_surface_get_width (surface);
-  h = cairo_image_surface_get_height (surface);
-
-  stride = cairo_image_surface_get_stride (surface);
-  old_stride = cairo_image_surface_get_stride (old_surface);
-
-  for (y = 0; y < h; y++)
-    {
-      line = (guint32 *)data;
-      old_line = (guint32 *)old_data;
-
-      for (x = 0; x < w; x++)
-       {
-         if ((*line & 0xffffff) == (*old_line & 0xffffff))
-           *old_line = 0;
-         else
-           *old_line = *line | 0xff000000;
-         line ++;
-         old_line ++;
-       }
-
-      data += stride;
-      old_data += old_stride;
-    }
-}
-
 void
 broadway_server_window_update (BroadwayServer *server,
                               gint id,
@@ -1435,7 +1397,7 @@ broadway_server_window_update (BroadwayServer *server,
     return;
 
   if (window->last_surface == NULL)
-    window->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+    window->last_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                                       window->width,
                                                       window->height);
 
@@ -1446,25 +1408,12 @@ broadway_server_window_update (BroadwayServer *server,
 
   if (server->output != NULL)
     {
-      if (window->last_synced)
-       {
-         diff_surfaces (surface,
-                        window->last_surface);
-         broadway_output_put_rgba (server->output, window->id, 0, 0,
-                                   cairo_image_surface_get_width (window->last_surface),
-                                   cairo_image_surface_get_height (window->last_surface),
-                                   cairo_image_surface_get_stride (window->last_surface),
-                                   cairo_image_surface_get_data (window->last_surface));
-       }
-      else
-       {
-         window->last_synced = TRUE;
-         broadway_output_put_rgb (server->output, window->id, 0, 0,
-                                  cairo_image_surface_get_width (surface),
-                                  cairo_image_surface_get_height (surface),
-                                  cairo_image_surface_get_stride (surface),
-                                  cairo_image_surface_get_data (surface));
-       }
+      window->last_synced = TRUE;
+      broadway_output_put_rgba (server->output, window->id, 0, 0,
+                                cairo_image_surface_get_width (surface),
+                                cairo_image_surface_get_height (surface),
+                                cairo_image_surface_get_stride (surface),
+                                cairo_image_surface_get_data (surface));
 
       broadway_output_surface_flush (server->output, window->id);
     }
@@ -1505,7 +1454,7 @@ broadway_server_window_move_resize (BroadwayServer *server,
 
       old = window->last_surface;
 
-      window->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+      window->last_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                                         width, height);
 
 
@@ -1654,7 +1603,7 @@ broadway_server_open_surface (BroadwayServer *server,
   data->data_size = size;
 
   surface = cairo_image_surface_create_for_data ((guchar *)data->data,
-                                                CAIRO_FORMAT_RGB24,
+                                                CAIRO_FORMAT_ARGB32,
                                                 width, height,
                                                 width * sizeof (guint32));
   g_assert (surface != NULL);
@@ -1760,11 +1709,11 @@ broadway_server_resync_windows (BroadwayServer *server)
          if (window->last_surface != NULL)
            {
              window->last_synced = TRUE;
-             broadway_output_put_rgb (server->output, window->id, 0, 0,
-                                      cairo_image_surface_get_width (window->last_surface),
-                                      cairo_image_surface_get_height (window->last_surface),
-                                      cairo_image_surface_get_stride (window->last_surface),
-                                      cairo_image_surface_get_data (window->last_surface));
+             broadway_output_put_rgba (server->output, window->id, 0, 0,
+                                        cairo_image_surface_get_width (window->last_surface),
+                                        cairo_image_surface_get_height (window->last_surface),
+                                        cairo_image_surface_get_stride (window->last_surface),
+                                        cairo_image_surface_get_data (window->last_surface));
            }
          broadway_output_surface_flush (server->output, window->id);
        }
index 8619f618c2df7a7d7ef2b3bb62ec2276d9587532..97ef30963c389307841ded2b8fc1848aeee968c7 100644 (file)
@@ -146,13 +146,12 @@ function flushSurface(surface)
     var commands = surface.drawQueue;
     surface.queue = [];
     var context = surface.canvas.getContext("2d");
-    context.globalCompositeOperation = "source-over";
+    context.globalCompositeOperation = "copy";
     var i = 0;
     for (i = 0; i < commands.length; i++) {
        var cmd = commands[i];
        switch (cmd.op) {
        case 'i': // put image data surface
-           context.globalCompositeOperation = "source-over";
            context.drawImage(cmd.img, cmd.x, cmd.y);
            break;
 
index 268f9f5c6c9c6f89a3bf216e3fe21ff5a80721ff..0324764b5f7bdc2b89047b03e0dfdeaac5cd80d7 100644 (file)
@@ -676,7 +676,7 @@ _gdk_broadway_server_create_surface (int                 width,
   data->data = create_random_shm (data->name, data->data_size);
 
   surface = cairo_image_surface_create_for_data ((guchar *)data->data,
-                                                CAIRO_FORMAT_RGB24, width, height, width * sizeof (guint32));
+                                                CAIRO_FORMAT_ARGB32, width, height, width * sizeof (guint32));
   g_assert (surface != NULL);
   
   cairo_surface_set_user_data (surface, &gdk_broadway_shm_cairo_key,
index cf7e6f9ea44c2620e93e50878e000bb6fa87110d..122e5be4c66027cf123b2adc0756567d124586af 100644 (file)
@@ -219,7 +219,7 @@ _gdk_broadway_screen_setup (GdkScreen *screen)
 static gboolean
 gdk_broadway_screen_is_composited (GdkScreen *screen)
 {
-  return FALSE;
+  return TRUE;
 }